package presentation;

import java.io.IOException;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;

import dao.EmpleadoDAO;
import dao.ProductoDAO;
import dao.VentaDAO;
import dao.VentaXProductosDAO;
import model.Empleado;
import model.Producto;
import model.Venta;
import model.VentaXProductos;
import services.ValidacionesServicio;

/**
 * Servlet implementation class AgregarVentaServlet
 */
@WebServlet("/AgregarVentaServlet")
public class AgregarVentaServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	public EmpleadoDAO empleadoService = null;
	public VentaDAO ventaService = null;
	public ProductoDAO productoService = null;
	public VentaXProductosDAO ventaXProductosService = null;
	public void init(ServletConfig config) {
		WebApplicationContext context = WebApplicationContextUtils
				.getRequiredWebApplicationContext(config.getServletContext());
		this.ventaService = (VentaDAO) context.getBean(VentaDAO.class);
		this.productoService = (ProductoDAO) context.getBean(ProductoDAO.class);
		this.empleadoService = (EmpleadoDAO) context.getBean(EmpleadoDAO.class);
		this.ventaXProductosService = (VentaXProductosDAO) context.getBean(VentaXProductosDAO.class);

	}
	/**
	 * @see HttpServlet#HttpServlet()
	 */
	public AgregarVentaServlet() {
		super();
		
	}

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		List<Empleado> empleados = this.empleadoService.getAll();
		List<Producto> productos = this.productoService.getAll();
		
		request.getSession().setAttribute("Empleados", empleados);
		request.getSession().setAttribute("Productos", productos);
		request.getSession().setAttribute("MensajeAgregarVenta", null);

		response.sendRedirect("agregarVenta.jsp");
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse
	 *      response)
	 */
	@SuppressWarnings("unused")
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String mensaje = null;

		Empleado usuario = (Empleado) request.getSession().getAttribute("UsuarioLogeado");
		
		List<Producto>subproductos = new ArrayList<Producto>();
		List<VentaXProductos>productos_cantidades = new ArrayList<VentaXProductos>();
		
		boolean valido = true;
		float precioTotal = 0;
		try{
			
			if (request.getParameter("btnNuevaVenta") != null) {				
						
				if (!request.getSession().getAttribute("Venta").equals(null)){
					Venta venta = (Venta) request.getSession().getAttribute("Venta");				
					@SuppressWarnings("unchecked")
					List<VentaXProductos>productos_cantidades_guardar = (List<VentaXProductos>) request.getSession().getAttribute("VentaXProductos");
					
					this.ventaService.save(venta);
					
					
					for(VentaXProductos vtx:productos_cantidades_guardar){
						vtx.setVenta(venta);
						this.ventaXProductosService.save(vtx);
						System.out.println("Se guardo ventaxproductos.");
					}

					
				
					
					System.out.println("Se guardo venta.");
					
					mensaje =  "Venta Registrada!";					
					
					request.getSession().setAttribute("Venta", null);
					request.getSession().setAttribute("SubProductos", null);
				}	
					
			}
			if (request.getParameter("btnAgregarProducto") != null) {
				DecimalFormat df = new DecimalFormat("#.##");
				df.setRoundingMode(RoundingMode.CEILING);
				
				Boolean valido_cantidades = false;
				Boolean valido_factura = false;				
				Venta venta_repetida = new Venta();
				Integer factura = Integer.parseInt(request.getParameter("inputFactura"));
				
				if (ValidacionesServicio.validarFactura(ventaService.getAll(), factura)){
					valido_factura = true;
				}
				else{
					venta_repetida = ValidacionesServicio.repetidaFactura(ventaService.getAll(), factura);
				}			
				
				Float total = (float) 0;
				
				
				String[] subProductosCantidades = request.getParameterValues("nuevaLista");
				
				 for (String s:subProductosCantidades){
					 String[] trimSubProductos = s.split(" - ");

					Integer id_producto = Integer.parseInt(trimSubProductos[0]);
					Integer cantidad = Integer.parseInt(trimSubProductos[3]);
					
					 Producto producto = productoService.getById(id_producto);
		        	 producto.setCantidad(cantidad);
		        	 subproductos.add(producto);
		        	 total+= producto.getPrecio() * producto.getCantidad();
		        	 valido_cantidades=true;
		        	 productos_cantidades.add(new VentaXProductos(producto,producto.getCantidad()));
				 }
				
				/*
				 * 
				 * String trimSubProductos = subProductosCantidades.split(" - ");

				Integer id_producto = Integer.parseInt(trimSubProductos[0]);
				Integer cantidad = Integer.parseInt(trimSubProductos[3]);
				System.out.println(id_producto + " - " + cantidad);
				
				System.out.println("length: "+  trimSubProductos.length);
				 * 
				 * */
				
				
				   /*
					if(parameter.toLowerCase().startsWith("0")) {
				        String[] values = parameters.get(parameter);
				        for (int i = 0;i<values.length;i++){
				        	if (values[i] != ""){				        		
					        	 Producto producto = productoService.getById(Integer.parseInt(parameter.toString().substring(1)));
					        	 producto.setCantidad(Integer.parseInt(values[i]));
					        	 subproductos.add(producto);
					        	 total+= producto.getPrecio() * producto.getCantidad();
					        	 valido_cantidades=true;
					        	 productos_cantidades.add(new VentaXProductos(producto,producto.getCantidad()));
				        	}				        	
				        }
				    }
				    */
				
				
				if (valido_cantidades && valido_factura){
						
							total = Float.parseFloat(df.format(total));
						Venta venta = new Venta(total,
								java.sql.Date.valueOf(request.getParameter("fecha")), factura, usuario);
						
					
						
						request.getSession().setAttribute("Venta", venta);
						request.getSession().setAttribute("SubProductos", subproductos);
						request.getSession().setAttribute("VentaXProductos", productos_cantidades);	

					
				}
				else{
					request.getSession().setAttribute("Venta", null);
					request.getSession().setAttribute("SubProductos", null);
					System.out.println("cantidades o factura error");
					if (!valido_cantidades) mensaje =  "Error en las cantidades";	
					if (!valido_factura) {
						mensaje =  "Factura " + venta_repetida.getFactura() + " - Fecha: " + venta_repetida.getFecha() + " Ingresada previamente por: \n" + venta_repetida.getEmpleado().getApellido() + ", " +venta_repetida.getEmpleado().getNombre() ;	
					}
				}		
			}		

		}
		catch (Exception e){
			System.out.println(e.getMessage());
			mensaje =  "Error en completar los campos..";		
			valido = false;
		}
		
		request.getSession().setAttribute("MensajeAgregarVenta", mensaje);
		response.sendRedirect("agregarVenta.jsp");
	}
	
	
}
